package com.delio.server.produccion.ordenproducciones;

import java.sql.SQLException;
import java.util.List;

import com.delio.client.produccion.detalleordenproducciones.DetalleOrdenProduccion;
import com.delio.client.produccion.detalleordenproducciones.DetalleOrdenProducciones;
import com.delio.client.produccion.detallerecetas.DetalleReceta;
import com.delio.client.produccion.ordenproducciones.OrdenProduccion;
import com.delio.client.produccion.ordenproducciones.OrdenProduccionService;
import com.delio.server.base.Conexion;
import com.delio.server.base.util.GxtGridPaginate;
import com.delio.server.series.Series;
import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
import com.extjs.gxt.ui.client.data.FilterPagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.ibatis.sqlmap.client.SqlMapClient;

public class OrdenProduccionServiceImpl extends RemoteServiceServlet 
implements OrdenProduccionService{

	private static final long serialVersionUID = 1L;
	
	static SqlMapClient sqlMap = Conexion.getSqlMap();
     
	@SuppressWarnings("unchecked")
	@Override
	public PagingLoadResult<OrdenProduccion> paginateOrdenProduccion(
			FilterPagingLoadConfig config) {
	
		GxtGridPaginate paginate = new GxtGridPaginate();
		paginate.config = config;
		paginate.setLimit();
		if(paginate.order.equals("")){
			paginate.order = " order by id desc";
		}
		List<OrdenProduccion> data = null;
		System.out.println("esta fuera del try");
		try {
			data = sqlMap.queryForList("paginateOrdenProduccion", paginate);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return new BasePagingLoadResult<OrdenProduccion>(data, paginate.offset, count(paginate));
	}
   
	public Integer count(GxtGridPaginate paginate){
		Integer count = null;
		try {
			count = (Integer) sqlMap.queryForObject("countOrdenProduccion", paginate);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count;
	}
	
	@SuppressWarnings("unchecked")
	public List<OrdenProduccion> ListarOrdenProduccion(){
		List<OrdenProduccion> lp = null;
		try{
			lp = sqlMap.queryForList("ListOrdenProduccion");			
		}catch(Exception e){
			e.printStackTrace();
		}
		return lp;
	}
	
	@Override
	public boolean guardar(OrdenProduccion op) {
	   boolean var = false;
	   Integer receta_id;
	   Integer articulo_id = op.getArticulo_id();
	   List<DetalleReceta> ldr = null;
	   //List<DetalleOrdenProduccion> ldop=null;
	   DetalleOrdenProduccion dop=null;
	   Double cantidad = op.getCantidad();
	   Double canttotal;
	   try{
		
		  sqlMap.startTransaction();
		  try{
			  receta_id = (Integer)sqlMap.queryForObject("getRecetaId", articulo_id);
			  System.out.println("receta_id.........."+receta_id);
			  
			  op.setReceta_id(receta_id);
			  
			  op.setCodigo(getNumeracion());
			  sqlMap.insert("insertOrdenProduccion",op);
			  Integer ordenproduccion_id = op.getId();
			  //DetalleOrdenProducciones.ordenproduccion_id = ordenproduccion_id; 
			  
			  dop = new DetalleOrdenProduccion();   
			  
			  ldr = sqlMap.queryForList("ListDetalleRecetaOP",receta_id);

			  for(DetalleReceta dr : ldr){
				 dop.setOrdenproduccion_id(ordenproduccion_id);
				 dop.setArticulo_id(dr.getArticuloreceta_id());
				 canttotal = cantidad*dr.getCantidad();
				 dop.setCantidad(dr.getCantidad());
                 dop.setCantidadusada(canttotal); 
				 sqlMap.insert("insertDetalleOrdenProduccion", dop);
      		  }
		   var = true;
	     }catch(Exception e){
	       var = false;       
		   e.printStackTrace();
	     } 
	     if(var)
	 	    sqlMap.commitTransaction();
	     else
			sqlMap.endTransaction();
	   }catch(Exception e){
		   var = false;
		   e.printStackTrace();
	   }
	  
    	return var;
	}
	
    public boolean actualizar(OrdenProduccion op){
		boolean var = false;
    	try{
    	   op.setCodigo(getNumeracion(op.getCodigo()));
		   sqlMap.update("updateOrdenProduccion",op);	
		   var = true;	
		}catch(Exception e){
			e.printStackTrace();
		}
		return var;
	}
    
    private  static String getNumeracion(){
		Series.sqlMap = sqlMap;
		return Series.actualizarNumeracion("numeroordenproduccion");
	}
	
	private static String getNumeracion(String codigoedit){
		Series.sqlMap = sqlMap;
		Series.ultimonumero = codigoedit;		
		return Series.actualizarNumeracion("numeroordenproduccion");
	}
    
           
	@Override
	public boolean eliminar(Integer id){
		boolean var = false;
		try{
			sqlMap.delete("deleteOrdenProduccion",id);
			var = true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return var;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<OrdenProduccion> ListFechas(String rsnombre) {
		
		List<OrdenProduccion> ld = null;
		try{
			ld = sqlMap.queryForList("ListFechas",rsnombre);
		}catch(Exception e){
			e.printStackTrace();
		}
		return ld;
	}


	public Integer getId() {
       Integer id=null;
       try{
        	id = (Integer)sqlMap.queryForObject("getId");
       }catch(Exception e){
           e.printStackTrace();	
        }
		return id;
	}
}